From 66fa37eb30c3a2739b4dedb22c76290575297b16 Mon Sep 17 00:00:00 2001 From: tsteven4 <13596209+tsteven4@users.noreply.github.com> Date: Wed, 15 Nov 2023 10:36:59 -0700 Subject: [PATCH] gpsmath isolation (#1218) gpsmath/gpsdatum/gpsproj don't have dependencies on the rest of jeeps. cleanup typedefs, macros, const tables. --- jeeps/gpsdatum.h | 457 +++++++++++++++++++++++------------------------ jeeps/gpsmath.cc | 187 ++++++++++--------- jeeps/gpsmath.h | 182 +++++++++---------- jeeps/gpsmem.h | 2 + jeeps/gpsproj.cc | 8 +- jeeps/gpsproj.h | 244 +++++++++++++------------ 6 files changed, 547 insertions(+), 533 deletions(-) diff --git a/jeeps/gpsdatum.h b/jeeps/gpsdatum.h index 4444797dd..2cfbb366a 100644 --- a/jeeps/gpsdatum.h +++ b/jeeps/gpsdatum.h @@ -2,235 +2,234 @@ #define JEEPS_GPSDATUM_H_INCLUDED_ - - typedef struct GPS_SEllipse { - const char* name; - double a; - double invf; - } GPS_OEllipse, *GPS_PEllipse; - - GPS_OEllipse GPS_Ellipse[]= { - { "Airy 1830", 6377563.396, 299.3249646 }, - { "Airy 1830 Modified", 6377340.189, 299.3249646 }, - { "Australian National", 6378160.000, 298.25 }, - { "Bessel 1841 (Namibia)", 6377483.865, 299.1528128 }, - { "Bessel 1841", 6377397.155, 299.1528128 }, - { "Clarke 1866", 6378206.400, 294.9786982 }, - { "Clarke 1880", 6378249.145, 293.465 }, - { "Everest (India 1830)", 6377276.345, 300.8017 }, - { "Everest (Sabah Sarawak)", 6377298.556, 300.8017 }, - { "Everest (India 1956)", 6377301.243, 300.8017 }, - { "Everest (Malaysia 1969)", 6377295.664, 300.8017 }, - { "Everest (Malay & Sing)", 6377304.063, 300.8017 }, - { "Everest (Pakistan)", 6377309.613, 300.8017 }, - { "Modified Fischer 1960", 6378155.000, 298.3 }, - { "Helmert 1906", 6378200.000, 298.3 }, - { "Hough 1960", 6378270.000, 297.0 }, - { "Indonesian 1974", 6378160.000, 298.247 }, - { "International 1924", 6378388.000, 297.0 }, - { "Krassovsky 1940", 6378245.000, 298.3 }, - { "GRS67", 6378160.000, 6356774.516 }, - { "GRS75", 6378140.000, 6356755.288 }, - { "GRS80", 6378137.000, 298.257222101 }, - { "S. American 1969", 6378160.000, 298.25 }, - { "WGS60", 6378165.000, 298.3 }, - { "WGS66", 6378145.000, 298.25 }, - { "WGS72", 6378135.000, 298.26 }, - { "WGS84", 6378137.000, 298.257223563 }, - { "Clarke 1880 (Benoit)", 6378300.789, 293.466 }, - }; - - - - typedef struct GPS_SDatum { - const char* name; - int ellipse; - double dx; - double dy; - double dz; - } GPS_ODatum, *GPS_PDatum; - - GPS_ODatum GPS_Datum[]= { - /* 000 */ { "Adindan", 6, -166, -15, 204 }, - /* 001 */ { "AFG", 18, -43, -163, 45 }, - /* 002 */ { "Ain-El-Abd", 17, -150, -251, -2 }, - /* 003 */ { "Alaska-NAD27", 5, -5, 135, 172 }, - /* 004 */ { "Alaska-Canada", 6, -9, 151, 185 }, - /* 005 */ { "Anna-1-Astro", 2, -491, -22, 435 }, - /* 006 */ { "ARC 1950 Mean", 6, -143, -90, -294 }, - /* 007 */ { "ARC 1960 Mean", 6, -160, -8, -300 }, - /* 008 */ { "Asc Island 58", 17, -207, 107, 52 }, - /* 009 */ { "Astro B4", 17, 114, -116, -333 }, - /* 010 */ { "Astro Beacon E", 17, 145, 75, -272 }, - /* 011 */ { "Astro pos 71/4", 17, -320, 550, -494 }, - /* 012 */ { "Astro stn 52", 17, 124, -234, -25 }, - /* 013 */ { "Australia Geo 1984", 2, -134, -48, 149 }, - /* 014 */ { "Bahamas NAD27", 6, -4, 154, 178 }, - /* 015 */ { "Bellevue IGN", 17, -127, -769, 472 }, - /* 016 */ { "Bermuda 1957", 6, -73, 213, 296 }, - /* 017 */ { "Bukit Rimpah", 4, -384, 664, -48 }, - /* 018 */ { "Camp_Area_Astro", 17, -104, -129, 239 }, - /* 019 */ { "Campo_Inchauspe", 17, -148, 136, 90 }, - /* 020 */ { "Canada_Mean(NAD27)", 5, -10, 158, 187 }, - /* 021 */ { "Canal_Zone_(NAD27)", 5, 0, 125, 201 }, - /* 022 */ { "Canton_Island_1966", 17, 298, -304, -375 }, - /* 023 */ { "Cape", 6, -136, -108, -292 }, - /* 024 */ { "Cape_Canaveral_mean", 5, -2, 150, 181 }, - /* 025 */ { "Carribean NAD27", 5, -7, 152, 178 }, - /* 026 */ { "Carthage", 6, -263, 6, 431 }, - /* 027 */ { "Cent America NAD27", 5 , 0, 125, 194 }, - /* 028 */ { "Chatham 1971", 17, 175, -38, 113 }, - /* 029 */ { "Chua Astro", 17, -134, 229, -29 }, - /* 030 */ { "Corrego Alegre", 17, -206, 172, -6 }, - /* 031 */ { "Cuba NAD27", 5, -9, 152, 178 }, - /* 032 */ { "Cyprus", 17, -104, -101, -140 }, - /* 033 */ { "Djakarta(Batavia)", 4, -377, 681, -50 }, - /* 034 */ { "DOS 1968", 17, 230, -199, -752 }, - /* 035 */ { "Easter lsland 1967", 17, 211, 147, 111 }, - /* 036 */ { "Egypt", 17, -130, -117, -151 }, - /* 037 */ { "European 1950", 17, -87, -96, -120 }, - /* 038 */ { "European 1950 mean", 17, -87, -98, -121 }, - /* 039 */ { "European 1979 mean", 17, -86, -98, -119 }, - /* 040 */ { "Finnish Nautical", 17, -78, -231, -97 }, - /* 041 */ { "Gandajika Base", 17, -133, -321, 50 }, - /* 042 */ { "Geodetic Datum 49", 17, 84, -22, 209 }, - /* 043 */ { "Ghana", 26, 0, 0, 0 }, - /* 044 */ { "Greenland NAD27", 5, 11, 114, 195 }, - /* 045 */ { "Guam 1963", 5, -100, -248, 259 }, - /* 046 */ { "Gunung Segara", 4, -403, 684, 41 }, - /* 047 */ { "Gunung Serindung 1962", 26, 0, 0, 0 }, - /* 048 */ { "GUX1 Astro", 17, 252, -209, -751 }, - /* 049 */ { "Herat North", 17, -333, -222, 114 }, - /* 050 */ { "Hjorsey 1955", 17, -73, 46, 86 }, - /* 051 */ { "Hong Kong 1963", 17, -156, -271, -189 }, - /* 052 */ { "Hu-Tzu-Shan", 17, -634, -549, -201 }, - /* 053 */ { "Indian", 9, 289, 734, 257 }, - /* 054 */ { "Iran", 17, -117, -132, -164 }, - /* 055 */ { "Ireland 1965", 1, 506, -122, 611 }, - /* 056 */ { "ISTS 073 Astro 69", 17, 208, -435, -229 }, - /* 057 */ { "Johnston Island 61", 17, 191, -77, -204 }, - /* 058 */ { "Kandawala", 7, -97, 787, 86 }, - /* 059 */ { "Kerguelen Island", 17, 145, -187, 103 }, - /* 060 */ { "Kertau 48", 11, -11, 851, 5 }, - /* 061 */ { "L.C. 5 Astro", 5, 42, 124, 147 }, - /* 062 */ { "La Reunion", 17, 94, -948, -1262 }, - /* 063 */ { "Liberia 1964", 6, -90, 40, 88 }, - /* 064 */ { "Luzon", 5, -133, -77, -51 }, - /* 065 */ { "Mahe 1971", 6, 41, -220, -134 }, - /* 066 */ { "Marco Astro", 17, -289, -124, 60 }, - /* 067 */ { "Masirah Is. Nahrwan", 6, -247, -148, 369 }, - /* 068 */ { "Massawa", 4, 639, 405, 60 }, - /* 069 */ { "Merchich", 6, 31, 146, 47 }, - /* 070 */ { "Mexico NAD27", 5, -12, 130, 190 }, - /* 071 */ { "Midway Astro 61", 17, 912, -58, 1227 }, - /* 072 */ { "Mindanao", 5, -133, -79, -72 }, - /* 073 */ { "Minna", 6, -92, -93, 122 }, - /* 074 */ { "Montjong Lowe", 26, 0, 0, 0 }, - /* 075 */ { "Nahrwan", 6, -231, -196, 482 }, - /* 076 */ { "Naparima BWI", 17, -2, 374, 172 }, - /* 077 */ { "North America 83", 21, 0, 0, 0 }, - /* 078 */ { "N. America 1927 mean", 5, -8, 160, 176 }, - /* 079 */ { "Observatorio 1966", 17, -425, -169, 81 }, - /* 080 */ { "Old Egyptian", 14, -130, 110, -13 }, - /* 081 */ { "Old Hawaiian_mean", 5, 89, -279, -183 }, - /* 082 */ { "Old Hawaiian Kauai", 5, 45, -290, -172 }, - /* 083 */ { "Old Hawaiian Maui", 5, 65, -290, -190 }, - /* 084 */ { "Old Hawaiian Oahu", 5, 56, -284, -181 }, - /* 085 */ { "Oman", 6, -346, -1, 224 }, - /* 086 */ { "OSGB36", 0, 375, -111, 431 }, - /* 087 */ { "Pico De Las Nieves", 17, -307, -92, 127 }, - /* 088 */ { "Pitcairn Astro 67", 17, 185, 165, 42 }, - /* 089 */ { "S. Am. 1956 mean(P)", 17, -288, 175, -376 }, - /* 090 */ { "S. Chilean 1963 (P)", 17, 16, 196, 93 }, - /* 091 */ { "Puerto Rico", 5, 11, 72, -101 }, - /* 092 */ { "Pulkovo 1942", 18, 28, -130, -95 }, - /* 093 */ { "Qornoq", 17, 164, 138, -189 }, - /* 094 */ { "Quatar National", 17, -128, -283, 22 }, - /* 095 */ { "Rome 1940", 17, -225, -65, 9 }, - /* 096 */ { "S-42(Pulkovo1942)", 18, 28, -121, -77 }, - /* 097 */ { "S.E.Asia_(Indian)", 7, 173, 750, 264 }, - /* 098 */ { "SAD-69/Brazil", 22, -60, -2, -41 }, - /* 099 */ { "Santa Braz", 17, -203, 141, 53 }, - /* 100 */ { "Santo (DOS)", 17, 170, 42, 84 }, - /* 101 */ { "Sapper Hill 43", 17, -355, 16, 74 }, - /* 102 */ { "Schwarzeck", 3, 616, 97, -251 }, - /* 103 */ { "Sicily", 17, -97, -88, -135 }, - /* 104 */ { "Sierra Leone 1960", 26, 0, 0, 0 }, - /* 105 */ { "S. Am. 1969 mean", 22, -57, 1, -41 }, - /* 106 */ { "South Asia", 13, 7, -10, -26 }, - /* 107 */ { "Southeast Base", 17, -499, -249, 314 }, - /* 108 */ { "Southwest Base", 17, -104, 167, -38 }, - /* 109 */ { "Tananarive Obs 25", 17, -189, -242, -91 }, - /* 110 */ { "Thai/Viet (Indian)", 7, 214, 836, 303 }, - /* 111 */ { "Timbalai 1948", 7, -689, 691, -45 }, - /* 112 */ { "Tokyo mean", 4, -128, 481, 664 }, - /* 113 */ { "Tristan Astro 1968", 17, -632, 438, -609 }, - /* 114 */ { "United Arab Emirates", 6, -249, -156, 381 }, - /* 115 */ { "Viti Levu 1916", 6, 51, 391, -36 }, - /* 116 */ { "Wake Eniwetok 60", 15, 101, 52, -39 }, - /* 117 */ { "WGS 72", 25, 0, 0, 5 }, - /* 118 */ { "WGS 84", 26, 0, 0, 0 }, - /* 119 */ { "Yacare", 17, -155, 171, 37 }, - /* 120 */ { "Zanderij", 17, -265, 120, -358 }, - /* 121 */ { "Sweden", 4, 424.3, -80.5, 613.1 }, - /* 122 */ { "GDA 94", 21, 0, 0, 0 }, - /* 123 */ { "CH-1903", 4, 674, 15, 405 }, - /* 124 */ { "Palestine 1923", 27, -235, -85, 264 }, - /* 125 */ { "ITM (Israeli New)", 21, -48, 55, -52 }, - { nullptr, 0, 0, 0, 0 } - }; - - - typedef struct GPS_SDatum_Alias { - const char* alias; - const int datum; - } GPS_ODatum_Alias, *GPS_PDatum_Alias; - - GPS_ODatum_Alias GPS_DatumAlias[] = { - { "Australian GDA94", 122 }, - { "Australian Geocentric 1994 (GDA94)", 122}, /* Observed in Ozi */ - { "GDA94", 122 }, - { "GDA-94", 122 }, - { "CH1903", 123 }, - { "CH 1903", 123 }, - { "European 1950 (Spain and Portugal)", 38 }, - { "Geodetic Datum 1949", 42 }, - { "NAD27 Alaska", 3 }, - { "NAD27 Bahamas", 14 }, - { "NAD27 Canada", 4 }, - { "NAD27 Canal Zone", 21 }, - { "NAD27 Caribbean", 25 }, - { "NAD27 Central", 27 }, - { "NAD27 CONUS", 78 }, - { "NAD27 Cuba", 31 }, - { "NAD27 Greenland", 44 }, - { "NAD27 Mexico", 70 }, - { "NAD83", 77 }, - { "NAD 83", 77 }, - { "NAD-83", 77 }, - { "OSGB 36", 86 }, - { "OSGB-36", 86 }, - { "Wake-Eniwetok 1960", 116 }, - { "WGS72", 117 }, - { "WGS-72", 117 }, - { "WGS84", 118 }, - { "WGS-84", 118 }, - { "Israeli", 124 }, - { "D_Israel_new", 125 }, - { nullptr, -1 } - }; - - - /* UK Ordnance Survey Nation Grid Map Codes */ - static const char* UKNG[]= { - "SV","SW","SX","SY","SZ","TV","TW","SQ","SR","SS","ST","SU","TQ","TR", - "SL","SM","SN","SO","SP","TL","TM","SF","SG","SH","SJ","SK","TF","TG", - "SA","SB","SC","SD","SE","TA","TB","NV","NW","NX","NY","NZ","OV","OW", - "NQ","NR","NS","NT","NU","OQ","OR","NL","NM","NN","NO","NP","OL","OM", - "NF","NG","NH","NJ","NK","OF","OG","NA","NB","NC","ND","NE","OA","OB", - "HV","HW","HX","HY","HZ","JV","JW","HQ","HR","HS","HT","HU","JQ","JR", - "HL","HM","HN","HO","HP","JL","JM","" - }; +struct GPS_Ellipse { + const char* name; + double a; + double invf; +}; + +const GPS_Ellipse GPS_Ellipses[]= { + { "Airy 1830", 6377563.396, 299.3249646 }, + { "Airy 1830 Modified", 6377340.189, 299.3249646 }, + { "Australian National", 6378160.000, 298.25 }, + { "Bessel 1841 (Namibia)", 6377483.865, 299.1528128 }, + { "Bessel 1841", 6377397.155, 299.1528128 }, + { "Clarke 1866", 6378206.400, 294.9786982 }, + { "Clarke 1880", 6378249.145, 293.465 }, + { "Everest (India 1830)", 6377276.345, 300.8017 }, + { "Everest (Sabah Sarawak)", 6377298.556, 300.8017 }, + { "Everest (India 1956)", 6377301.243, 300.8017 }, + { "Everest (Malaysia 1969)", 6377295.664, 300.8017 }, + { "Everest (Malay & Sing)", 6377304.063, 300.8017 }, + { "Everest (Pakistan)", 6377309.613, 300.8017 }, + { "Modified Fischer 1960", 6378155.000, 298.3 }, + { "Helmert 1906", 6378200.000, 298.3 }, + { "Hough 1960", 6378270.000, 297.0 }, + { "Indonesian 1974", 6378160.000, 298.247 }, + { "International 1924", 6378388.000, 297.0 }, + { "Krassovsky 1940", 6378245.000, 298.3 }, + { "GRS67", 6378160.000, 6356774.516 }, + { "GRS75", 6378140.000, 6356755.288 }, + { "GRS80", 6378137.000, 298.257222101 }, + { "S. American 1969", 6378160.000, 298.25 }, + { "WGS60", 6378165.000, 298.3 }, + { "WGS66", 6378145.000, 298.25 }, + { "WGS72", 6378135.000, 298.26 }, + { "WGS84", 6378137.000, 298.257223563 }, + { "Clarke 1880 (Benoit)", 6378300.789, 293.466 }, +}; + + + +struct GPS_Datum { + const char* name; + int ellipse; + double dx; + double dy; + double dz; +}; + +const GPS_Datum GPS_Datums[]= { + /* 000 */ { "Adindan", 6, -166, -15, 204 }, + /* 001 */ { "AFG", 18, -43, -163, 45 }, + /* 002 */ { "Ain-El-Abd", 17, -150, -251, -2 }, + /* 003 */ { "Alaska-NAD27", 5, -5, 135, 172 }, + /* 004 */ { "Alaska-Canada", 6, -9, 151, 185 }, + /* 005 */ { "Anna-1-Astro", 2, -491, -22, 435 }, + /* 006 */ { "ARC 1950 Mean", 6, -143, -90, -294 }, + /* 007 */ { "ARC 1960 Mean", 6, -160, -8, -300 }, + /* 008 */ { "Asc Island 58", 17, -207, 107, 52 }, + /* 009 */ { "Astro B4", 17, 114, -116, -333 }, + /* 010 */ { "Astro Beacon E", 17, 145, 75, -272 }, + /* 011 */ { "Astro pos 71/4", 17, -320, 550, -494 }, + /* 012 */ { "Astro stn 52", 17, 124, -234, -25 }, + /* 013 */ { "Australia Geo 1984", 2, -134, -48, 149 }, + /* 014 */ { "Bahamas NAD27", 6, -4, 154, 178 }, + /* 015 */ { "Bellevue IGN", 17, -127, -769, 472 }, + /* 016 */ { "Bermuda 1957", 6, -73, 213, 296 }, + /* 017 */ { "Bukit Rimpah", 4, -384, 664, -48 }, + /* 018 */ { "Camp_Area_Astro", 17, -104, -129, 239 }, + /* 019 */ { "Campo_Inchauspe", 17, -148, 136, 90 }, + /* 020 */ { "Canada_Mean(NAD27)", 5, -10, 158, 187 }, + /* 021 */ { "Canal_Zone_(NAD27)", 5, 0, 125, 201 }, + /* 022 */ { "Canton_Island_1966", 17, 298, -304, -375 }, + /* 023 */ { "Cape", 6, -136, -108, -292 }, + /* 024 */ { "Cape_Canaveral_mean", 5, -2, 150, 181 }, + /* 025 */ { "Carribean NAD27", 5, -7, 152, 178 }, + /* 026 */ { "Carthage", 6, -263, 6, 431 }, + /* 027 */ { "Cent America NAD27", 5, 0, 125, 194 }, + /* 028 */ { "Chatham 1971", 17, 175, -38, 113 }, + /* 029 */ { "Chua Astro", 17, -134, 229, -29 }, + /* 030 */ { "Corrego Alegre", 17, -206, 172, -6 }, + /* 031 */ { "Cuba NAD27", 5, -9, 152, 178 }, + /* 032 */ { "Cyprus", 17, -104, -101, -140 }, + /* 033 */ { "Djakarta(Batavia)", 4, -377, 681, -50 }, + /* 034 */ { "DOS 1968", 17, 230, -199, -752 }, + /* 035 */ { "Easter lsland 1967", 17, 211, 147, 111 }, + /* 036 */ { "Egypt", 17, -130, -117, -151 }, + /* 037 */ { "European 1950", 17, -87, -96, -120 }, + /* 038 */ { "European 1950 mean", 17, -87, -98, -121 }, + /* 039 */ { "European 1979 mean", 17, -86, -98, -119 }, + /* 040 */ { "Finnish Nautical", 17, -78, -231, -97 }, + /* 041 */ { "Gandajika Base", 17, -133, -321, 50 }, + /* 042 */ { "Geodetic Datum 49", 17, 84, -22, 209 }, + /* 043 */ { "Ghana", 26, 0, 0, 0 }, + /* 044 */ { "Greenland NAD27", 5, 11, 114, 195 }, + /* 045 */ { "Guam 1963", 5, -100, -248, 259 }, + /* 046 */ { "Gunung Segara", 4, -403, 684, 41 }, + /* 047 */ { "Gunung Serindung 1962", 26, 0, 0, 0 }, + /* 048 */ { "GUX1 Astro", 17, 252, -209, -751 }, + /* 049 */ { "Herat North", 17, -333, -222, 114 }, + /* 050 */ { "Hjorsey 1955", 17, -73, 46, 86 }, + /* 051 */ { "Hong Kong 1963", 17, -156, -271, -189 }, + /* 052 */ { "Hu-Tzu-Shan", 17, -634, -549, -201 }, + /* 053 */ { "Indian", 9, 289, 734, 257 }, + /* 054 */ { "Iran", 17, -117, -132, -164 }, + /* 055 */ { "Ireland 1965", 1, 506, -122, 611 }, + /* 056 */ { "ISTS 073 Astro 69", 17, 208, -435, -229 }, + /* 057 */ { "Johnston Island 61", 17, 191, -77, -204 }, + /* 058 */ { "Kandawala", 7, -97, 787, 86 }, + /* 059 */ { "Kerguelen Island", 17, 145, -187, 103 }, + /* 060 */ { "Kertau 48", 11, -11, 851, 5 }, + /* 061 */ { "L.C. 5 Astro", 5, 42, 124, 147 }, + /* 062 */ { "La Reunion", 17, 94, -948, -1262 }, + /* 063 */ { "Liberia 1964", 6, -90, 40, 88 }, + /* 064 */ { "Luzon", 5, -133, -77, -51 }, + /* 065 */ { "Mahe 1971", 6, 41, -220, -134 }, + /* 066 */ { "Marco Astro", 17, -289, -124, 60 }, + /* 067 */ { "Masirah Is. Nahrwan", 6, -247, -148, 369 }, + /* 068 */ { "Massawa", 4, 639, 405, 60 }, + /* 069 */ { "Merchich", 6, 31, 146, 47 }, + /* 070 */ { "Mexico NAD27", 5, -12, 130, 190 }, + /* 071 */ { "Midway Astro 61", 17, 912, -58, 1227 }, + /* 072 */ { "Mindanao", 5, -133, -79, -72 }, + /* 073 */ { "Minna", 6, -92, -93, 122 }, + /* 074 */ { "Montjong Lowe", 26, 0, 0, 0 }, + /* 075 */ { "Nahrwan", 6, -231, -196, 482 }, + /* 076 */ { "Naparima BWI", 17, -2, 374, 172 }, + /* 077 */ { "North America 83", 21, 0, 0, 0 }, + /* 078 */ { "N. America 1927 mean", 5, -8, 160, 176 }, + /* 079 */ { "Observatorio 1966", 17, -425, -169, 81 }, + /* 080 */ { "Old Egyptian", 14, -130, 110, -13 }, + /* 081 */ { "Old Hawaiian_mean", 5, 89, -279, -183 }, + /* 082 */ { "Old Hawaiian Kauai", 5, 45, -290, -172 }, + /* 083 */ { "Old Hawaiian Maui", 5, 65, -290, -190 }, + /* 084 */ { "Old Hawaiian Oahu", 5, 56, -284, -181 }, + /* 085 */ { "Oman", 6, -346, -1, 224 }, + /* 086 */ { "OSGB36", 0, 375, -111, 431 }, + /* 087 */ { "Pico De Las Nieves", 17, -307, -92, 127 }, + /* 088 */ { "Pitcairn Astro 67", 17, 185, 165, 42 }, + /* 089 */ { "S. Am. 1956 mean(P)", 17, -288, 175, -376 }, + /* 090 */ { "S. Chilean 1963 (P)", 17, 16, 196, 93 }, + /* 091 */ { "Puerto Rico", 5, 11, 72, -101 }, + /* 092 */ { "Pulkovo 1942", 18, 28, -130, -95 }, + /* 093 */ { "Qornoq", 17, 164, 138, -189 }, + /* 094 */ { "Quatar National", 17, -128, -283, 22 }, + /* 095 */ { "Rome 1940", 17, -225, -65, 9 }, + /* 096 */ { "S-42(Pulkovo1942)", 18, 28, -121, -77 }, + /* 097 */ { "S.E.Asia_(Indian)", 7, 173, 750, 264 }, + /* 098 */ { "SAD-69/Brazil", 22, -60, -2, -41 }, + /* 099 */ { "Santa Braz", 17, -203, 141, 53 }, + /* 100 */ { "Santo (DOS)", 17, 170, 42, 84 }, + /* 101 */ { "Sapper Hill 43", 17, -355, 16, 74 }, + /* 102 */ { "Schwarzeck", 3, 616, 97, -251 }, + /* 103 */ { "Sicily", 17, -97, -88, -135 }, + /* 104 */ { "Sierra Leone 1960", 26, 0, 0, 0 }, + /* 105 */ { "S. Am. 1969 mean", 22, -57, 1, -41 }, + /* 106 */ { "South Asia", 13, 7, -10, -26 }, + /* 107 */ { "Southeast Base", 17, -499, -249, 314 }, + /* 108 */ { "Southwest Base", 17, -104, 167, -38 }, + /* 109 */ { "Tananarive Obs 25", 17, -189, -242, -91 }, + /* 110 */ { "Thai/Viet (Indian)", 7, 214, 836, 303 }, + /* 111 */ { "Timbalai 1948", 7, -689, 691, -45 }, + /* 112 */ { "Tokyo mean", 4, -128, 481, 664 }, + /* 113 */ { "Tristan Astro 1968", 17, -632, 438, -609 }, + /* 114 */ { "United Arab Emirates", 6, -249, -156, 381 }, + /* 115 */ { "Viti Levu 1916", 6, 51, 391, -36 }, + /* 116 */ { "Wake Eniwetok 60", 15, 101, 52, -39 }, + /* 117 */ { "WGS 72", 25, 0, 0, 5 }, + /* 118 */ { "WGS 84", 26, 0, 0, 0 }, + /* 119 */ { "Yacare", 17, -155, 171, 37 }, + /* 120 */ { "Zanderij", 17, -265, 120, -358 }, + /* 121 */ { "Sweden", 4, 424.3, -80.5, 613.1 }, + /* 122 */ { "GDA 94", 21, 0, 0, 0 }, + /* 123 */ { "CH-1903", 4, 674, 15, 405 }, + /* 124 */ { "Palestine 1923", 27, -235, -85, 264 }, + /* 125 */ { "ITM (Israeli New)", 21, -48, 55, -52 }, + { nullptr, 0, 0, 0, 0 } +}; + + +struct GPS_Datum_Alias { + const char* alias; + int datum; +}; + +const GPS_Datum_Alias GPS_DatumAliases[] = { + { "Australian GDA94", 122 }, + { "Australian Geocentric 1994 (GDA94)", 122}, /* Observed in Ozi */ + { "GDA94", 122 }, + { "GDA-94", 122 }, + { "CH1903", 123 }, + { "CH 1903", 123 }, + { "European 1950 (Spain and Portugal)", 38 }, + { "Geodetic Datum 1949", 42 }, + { "NAD27 Alaska", 3 }, + { "NAD27 Bahamas", 14 }, + { "NAD27 Canada", 4 }, + { "NAD27 Canal Zone", 21 }, + { "NAD27 Caribbean", 25 }, + { "NAD27 Central", 27 }, + { "NAD27 CONUS", 78 }, + { "NAD27 Cuba", 31 }, + { "NAD27 Greenland", 44 }, + { "NAD27 Mexico", 70 }, + { "NAD83", 77 }, + { "NAD 83", 77 }, + { "NAD-83", 77 }, + { "OSGB 36", 86 }, + { "OSGB-36", 86 }, + { "Wake-Eniwetok 1960", 116 }, + { "WGS72", 117 }, + { "WGS-72", 117 }, + { "WGS84", 118 }, + { "WGS-84", 118 }, + { "Israeli", 124 }, + { "D_Israel_new", 125 }, + { nullptr, -1 } +}; + + +/* UK Ordnance Survey Nation Grid Map Codes */ +static const char* const UKNG[]= { + "SV","SW","SX","SY","SZ","TV","TW","SQ","SR","SS","ST","SU","TQ","TR", + "SL","SM","SN","SO","SP","TL","TM","SF","SG","SH","SJ","SK","TF","TG", + "SA","SB","SC","SD","SE","TA","TB","NV","NW","NX","NY","NZ","OV","OW", + "NQ","NR","NS","NT","NU","OQ","OR","NL","NM","NN","NO","NP","OL","OM", + "NF","NG","NH","NJ","NK","OF","OG","NA","NB","NC","ND","NE","OA","OB", + "HV","HW","HX","HY","HZ","JV","JW","HQ","HR","HS","HT","HU","JQ","JR", + "HL","HM","HN","HO","HP","JL","JM","" +}; diff --git a/jeeps/gpsmath.cc b/jeeps/gpsmath.cc index 56a24581a..8da383fa5 100644 --- a/jeeps/gpsmath.cc +++ b/jeeps/gpsmath.cc @@ -21,11 +21,19 @@ ** Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ********************************************************************/ -#include "jeeps/gps.h" -#include "jeeps/gpsdatum.h" -#include -#include -#include +#include "jeeps/gpsmath.h" + +#include // for assert +#include // for sin, tan, cos, pow, log, sqrt, asin, atan, exp, fabs, round +#include // for int32_t +#include // for abs +#include // for strcmp, strcpy +#include // for time_t + +#include // for QString + +#include "defs.h" // for case_ignore_strcmp, fatal, CSTR +#include "jeeps/gpsdatum.h" // for GPS_ODatum, GPS_OEllipse, GPS_Datums, GPS_Ellipses, UKNG, GPS_SDatum_Alias, GPS_SDatum, GPS_DatumAliases, GPS_PDatum, GPS_PDatum_Alias static int32_t GPS_Math_LatLon_To_UTM_Param(double lat, double lon, int32_t* zone, @@ -705,8 +713,9 @@ int32_t GPS_Math_WGS84_To_Swiss_EN(double lat, double lon, double* E, return 0; } - a = GPS_Ellipse[4].a; - b = a - (a / GPS_Ellipse[4].invf); + assert(strcmp(GPS_Ellipses[4].name, "Bessel 1841") == 0); + a = GPS_Ellipses[4].a; + b = a - (a / GPS_Ellipses[4].invf); GPS_Math_WGS84_To_Known_Datum_M(lat, lon, 0, &phi, &lambda, &alt, 123); GPS_Math_Swiss_LatLon_To_EN(phi, lambda, E, N, phi0, lambda0, E0, N0, a, b); @@ -735,8 +744,9 @@ void GPS_Math_Swiss_EN_To_WGS84(double E, double N, double* lat, double* lon) const double N0 = 200000.0; double phi, lambda, alt, a, b; - a = GPS_Ellipse[4].a; - b = a - (a / GPS_Ellipse[4].invf); + assert(strcmp(GPS_Ellipses[4].name, "Bessel 1841") == 0); + a = GPS_Ellipses[4].a; + b = a - (a / GPS_Ellipses[4].invf); GPS_Math_Swiss_EN_To_LatLon(E, N, &phi, &lambda, phi0, lambda0, E0, N0, a, b); GPS_Math_Known_Datum_To_WGS84_M(phi, lambda, 0, lat, lon, &alt, 123); @@ -1099,10 +1109,10 @@ int32_t GPS_Math_WGS84_To_ICS_EN(double lat, double lon, double* E, if (datum < 0) { fatal("Unable to find Palestine 1923 in internal tables"); } - int32_t ellipse = GPS_Datum[datum].ellipse; + int32_t ellipse = GPS_Datums[datum].ellipse; - a = GPS_Ellipse[ellipse].a; - b = a - (a / GPS_Ellipse[ellipse].invf); + a = GPS_Ellipses[ellipse].a; + b = a - (a / GPS_Ellipses[ellipse].invf); GPS_Math_WGS84_To_Known_Datum_M(lat, lon, 0, &phi, &lambda, &alt, datum); GPS_Math_Cassini_LatLon_To_EN(phi, lambda, E, N, @@ -1135,10 +1145,10 @@ void GPS_Math_ICS_EN_To_WGS84(double E, double N, double* lat, double* lon) if (datum < 0) { fatal("Unable to find Palestine 1923 in internal tables"); } - int32_t ellipse = GPS_Datum[datum].ellipse; + int32_t ellipse = GPS_Datums[datum].ellipse; - a = GPS_Ellipse[ellipse].a; - b = a - (a / GPS_Ellipse[ellipse].invf); + a = GPS_Ellipses[ellipse].a; + b = a - (a / GPS_Ellipses[ellipse].invf); GPS_Math_Cassini_EN_To_LatLon(E, N, &phi, &lambda, phi0, lambda0, E0, N0, a, b); @@ -1519,7 +1529,7 @@ void GPS_Math_Molodensky(double Sphi, double Slam, double SH, double Sa, ** @param [w] Dphi [double *] dest latitude (deg) ** @param [w] Dlam [double *] dest longitude (deg) ** @param [w] DH [double *] dest height (metres) -** @param [r] n [int32] datum number from GPS_Datum structure +** @param [r] n [int32] datum number from GPS_Datums structure ** ** @return [void] ************************************************************************/ @@ -1539,12 +1549,12 @@ void GPS_Math_Known_Datum_To_WGS84_M(double Sphi, double Slam, double SH, Da = 6378137.0; Dif = 298.257223563; - idx = GPS_Datum[n].ellipse; - Sa = GPS_Ellipse[idx].a; - Sif = GPS_Ellipse[idx].invf; - x = GPS_Datum[n].dx; - y = GPS_Datum[n].dy; - z = GPS_Datum[n].dz; + idx = GPS_Datums[n].ellipse; + Sa = GPS_Ellipses[idx].a; + Sif = GPS_Ellipses[idx].invf; + x = GPS_Datums[n].dx; + y = GPS_Datums[n].dy; + z = GPS_Datums[n].dz; GPS_Math_Molodensky(Sphi,Slam,SH,Sa,Sif,Dphi,Dlam,DH,Da,Dif,x,y,z); @@ -1563,7 +1573,7 @@ void GPS_Math_Known_Datum_To_WGS84_M(double Sphi, double Slam, double SH, ** @param [w] Dphi [double *] dest latitude (deg) ** @param [w] Dlam [double *] dest longitude (deg) ** @param [w] DH [double *] dest height (metres) -** @param [r] n [int32] datum number from GPS_Datum structure +** @param [r] n [int32] datum number from GPS_Datums structure ** ** @return [void] ************************************************************************/ @@ -1583,12 +1593,12 @@ void GPS_Math_WGS84_To_Known_Datum_M(double Sphi, double Slam, double SH, Sa = 6378137.0; Sif = 298.257223563; - idx = GPS_Datum[n].ellipse; - Da = GPS_Ellipse[idx].a; - Dif = GPS_Ellipse[idx].invf; - x = -GPS_Datum[n].dx; - y = -GPS_Datum[n].dy; - z = -GPS_Datum[n].dz; + idx = GPS_Datums[n].ellipse; + Da = GPS_Ellipses[idx].a; + Dif = GPS_Ellipses[idx].invf; + x = -GPS_Datums[n].dx; + y = -GPS_Datums[n].dy; + z = -GPS_Datums[n].dz; GPS_Math_Molodensky(Sphi,Slam,SH,Sa,Sif,Dphi,Dlam,DH,Da,Dif,x,y,z); @@ -1607,7 +1617,7 @@ void GPS_Math_WGS84_To_Known_Datum_M(double Sphi, double Slam, double SH, ** @param [w] Dphi [double *] dest latitude (deg) ** @param [w] Dlam [double *] dest longitude (deg) ** @param [w] DH [double *] dest height (metres) -** @param [r] n [int32] datum number from GPS_Datum structure +** @param [r] n [int32] datum number from GPS_Datums structure ** ** @return [void] ************************************************************************/ @@ -1633,14 +1643,14 @@ void GPS_Math_Known_Datum_To_WGS84_C(double Sphi, double Slam, double SH, Dif = 298.257223563; Db = Da - (Da / Dif); - idx = GPS_Datum[n].ellipse; - Sa = GPS_Ellipse[idx].a; - Sif = GPS_Ellipse[idx].invf; + idx = GPS_Datums[n].ellipse; + Sa = GPS_Ellipses[idx].a; + Sif = GPS_Ellipses[idx].invf; Sb = Sa - (Sa / Sif); - x = GPS_Datum[n].dx; - y = GPS_Datum[n].dy; - z = GPS_Datum[n].dz; + x = GPS_Datums[n].dx; + y = GPS_Datums[n].dy; + z = GPS_Datums[n].dz; GPS_Math_LatLonH_To_XYZ(Sphi,Slam,SH,&sx,&sy,&sz,Sa,Sb); sx += x; @@ -1664,7 +1674,7 @@ void GPS_Math_Known_Datum_To_WGS84_C(double Sphi, double Slam, double SH, ** @param [w] Dphi [double *] dest latitude (deg) ** @param [w] Dlam [double *] dest longitude (deg) ** @param [w] DH [double *] dest height (metres) -** @param [r] n [int32] datum number from GPS_Datum structure +** @param [r] n [int32] datum number from GPS_Datums structure ** ** @return [void] ************************************************************************/ @@ -1690,14 +1700,14 @@ void GPS_Math_WGS84_To_Known_Datum_C(double Sphi, double Slam, double SH, Sif = 298.257223563; Sb = Sa - (Sa / Sif); - idx = GPS_Datum[n].ellipse; - Da = GPS_Ellipse[idx].a; - Dif = GPS_Ellipse[idx].invf; + idx = GPS_Datums[n].ellipse; + Da = GPS_Ellipses[idx].a; + Dif = GPS_Ellipses[idx].invf; Db = Da - (Da / Dif); - x = -GPS_Datum[n].dx; - y = -GPS_Datum[n].dy; - z = -GPS_Datum[n].dz; + x = -GPS_Datums[n].dx; + y = -GPS_Datums[n].dy; + z = -GPS_Datums[n].dz; GPS_Math_LatLonH_To_XYZ(Sphi,Slam,SH,&dx,&dy,&dz,Sa,Sb); dx += x; @@ -1721,8 +1731,8 @@ void GPS_Math_WGS84_To_Known_Datum_C(double Sphi, double Slam, double SH, ** @param [w] Dphi [double *] dest latitude (deg) ** @param [w] Dlam [double *] dest longitude (deg) ** @param [w] DH [double *] dest height (metres) -** @param [r] n1 [int32] source datum number from GPS_Datum structure -** @param [r] n2 [int32] dest datum number from GPS_Datum structure +** @param [r] n1 [int32] source datum number from GPS_Datums structure +** @param [r] n2 [int32] dest datum number from GPS_Datums structure ** ** @return [void] ************************************************************************/ @@ -1748,19 +1758,19 @@ void GPS_Math_Known_Datum_To_Known_Datum_M(double Sphi, double Slam, double SH, int32_t idx2; - idx1 = GPS_Datum[n1].ellipse; - Sa = GPS_Ellipse[idx1].a; - Sif = GPS_Ellipse[idx1].invf; - x1 = GPS_Datum[n1].dx; - y1 = GPS_Datum[n1].dy; - z1 = GPS_Datum[n1].dz; + idx1 = GPS_Datums[n1].ellipse; + Sa = GPS_Ellipses[idx1].a; + Sif = GPS_Ellipses[idx1].invf; + x1 = GPS_Datums[n1].dx; + y1 = GPS_Datums[n1].dy; + z1 = GPS_Datums[n1].dz; - idx2 = GPS_Datum[n2].ellipse; - Da = GPS_Ellipse[idx2].a; - Dif = GPS_Ellipse[idx2].invf; - x2 = GPS_Datum[n2].dx; - y2 = GPS_Datum[n2].dy; - z2 = GPS_Datum[n2].dz; + idx2 = GPS_Datums[n2].ellipse; + Da = GPS_Ellipses[idx2].a; + Dif = GPS_Ellipses[idx2].invf; + x2 = GPS_Datums[n2].dx; + y2 = GPS_Datums[n2].dy; + z2 = GPS_Datums[n2].dz; x = -(x2-x1); y = -(y2-y1); @@ -1783,8 +1793,8 @@ void GPS_Math_Known_Datum_To_Known_Datum_M(double Sphi, double Slam, double SH, ** @param [w] Dphi [double *] dest latitude (deg) ** @param [w] Dlam [double *] dest longitude (deg) ** @param [w] DH [double *] dest height (metres) -** @param [r] n1 [int32] source datum number from GPS_Datum structure -** @param [r] n2 [int32] dest datum number from GPS_Datum structure +** @param [r] n1 [int32] source datum number from GPS_Datums structure +** @param [r] n2 [int32] dest datum number from GPS_Datums structure ** ** @return [void] ************************************************************************/ @@ -1812,23 +1822,23 @@ void GPS_Math_Known_Datum_To_Known_Datum_C(double Sphi, double Slam, double SH, double dy; double dz; - idx1 = GPS_Datum[n1].ellipse; - Sa = GPS_Ellipse[idx1].a; - Sif = GPS_Ellipse[idx1].invf; + idx1 = GPS_Datums[n1].ellipse; + Sa = GPS_Ellipses[idx1].a; + Sif = GPS_Ellipses[idx1].invf; Sb = Sa - (Sa / Sif); - x1 = GPS_Datum[n1].dx; - y1 = GPS_Datum[n1].dy; - z1 = GPS_Datum[n1].dz; + x1 = GPS_Datums[n1].dx; + y1 = GPS_Datums[n1].dy; + z1 = GPS_Datums[n1].dz; - idx2 = GPS_Datum[n2].ellipse; - Da = GPS_Ellipse[idx2].a; - Dif = GPS_Ellipse[idx2].invf; + idx2 = GPS_Datums[n2].ellipse; + Da = GPS_Ellipses[idx2].a; + Dif = GPS_Ellipses[idx2].invf; Db = Da - (Da / Dif); - x2 = GPS_Datum[n2].dx; - y2 = GPS_Datum[n2].dy; - z2 = GPS_Datum[n2].dz; + x2 = GPS_Datums[n2].dx; + y2 = GPS_Datums[n2].dy; + z2 = GPS_Datums[n2].dz; GPS_Math_LatLonH_To_XYZ(Sphi,Slam,SH,&dx,&dy,&dz,Sa,Sb); dx += -(x2-x1); @@ -2116,8 +2126,9 @@ int32_t GPS_Math_NAD83_To_UTM_EN(double lat, double lon, double* E, phi0 = 0.0; - a = GPS_Ellipse[21].a; - b = a - (a/GPS_Ellipse[21].invf); + assert(strcmp(GPS_Ellipses[21].name, "GRS80") == 0); + a = GPS_Ellipses[21].a; + b = a - (a / GPS_Ellipses[21].invf); GPS_Math_LatLon_To_EN(E,N,lat,lon,N0,E0,phi0,lambda0,F0,a,b); @@ -2243,7 +2254,7 @@ int32_t GPS_Math_UTM_EN_To_WGS84(double* lat, double* lon, double E, return 0; } - GPS_Math_UTM_EN_to_LatLon(GPS_Datum[118].ellipse, N, E, lat, lon, lambda0, E0, N0); + GPS_Math_UTM_EN_to_LatLon(GPS_Datums[118].ellipse, N, E, lat, lon, lambda0, E0, N0); return 1; } @@ -2258,7 +2269,7 @@ int32_t GPS_Math_UTM_EN_To_WGS84(double* lat, double* lon, double E, ** @param [w] N [double *] northing (metres) ** @param [w] zone [int32 *] zone number ** @param [w] zc [char *] zone character -** @param [r] n [int32] datum number from GPS_Datum structure +** @param [r] n [int32] datum number from GPS_Datums structure ** ** @return [int32] success ************************************************************************/ @@ -2281,9 +2292,9 @@ int32_t GPS_Math_Known_Datum_To_UTM_EN(double lat, double lon, double* E, phi0 = 0.0; - idx = GPS_Datum[n].ellipse; - a = GPS_Ellipse[idx].a; - b = a - (a/GPS_Ellipse[idx].invf); + idx = GPS_Datums[n].ellipse; + a = GPS_Ellipses[idx].a; + b = a - (a / GPS_Ellipses[idx].invf); GPS_Math_LatLon_To_EN(E,N,lat,lon,N0,E0,phi0,lambda0,F0,a,b); @@ -2300,7 +2311,7 @@ int32_t GPS_Math_Known_Datum_To_UTM_EN(double lat, double lon, double* E, ** @param [w] N [double] northing (metres) ** @param [w] zone [int32] zone number ** @param [w] zc [char] zone character -** @param [r] n [int32] datum number from GPS_Datum structure +** @param [r] n [int32] datum number from GPS_Datums structure ** ** @return [int32] success ************************************************************************/ @@ -2316,7 +2327,7 @@ int32_t GPS_Math_UTM_EN_To_Known_Datum(double* lat, double* lon, double E, return 0; } - GPS_Math_UTM_EN_to_LatLon(GPS_Datum[n].ellipse, N, E, lat, lon, lambda0, E0, N0); + GPS_Math_UTM_EN_to_LatLon(GPS_Datums[n].ellipse, N, E, lat, lon, lambda0, E0, N0); return 1; } @@ -2514,8 +2525,8 @@ void GPS_Math_UTM_EN_to_LatLon(int ReferenceEllipsoid, double mu, phi1Rad; double x, y; - a = GPS_Ellipse[ReferenceEllipsoid].a; - b = 1 / GPS_Ellipse[ReferenceEllipsoid].invf; + a = GPS_Ellipses[ReferenceEllipsoid].a; + b = 1 / GPS_Ellipses[ReferenceEllipsoid].invf; eccSquared = b * (2.0 - b); e1 = (1-sqrt(1-eccSquared))/(1+sqrt(1-eccSquared)); @@ -2549,18 +2560,18 @@ void GPS_Math_UTM_EN_to_LatLon(int ReferenceEllipsoid, int32_t GPS_Lookup_Datum_Index(const char* n) { - GPS_PDatum dp; - GPS_PDatum_Alias al; + const GPS_Datum* dp; + const GPS_Datum_Alias* al; - for (al = GPS_DatumAlias; al->alias; al++) { + for (al = GPS_DatumAliases; al->alias; al++) { if (case_ignore_strcmp(al->alias, n) == 0) { return al->datum; } } - for (dp = GPS_Datum; dp->name; dp++) { + for (dp = GPS_Datums; dp->name; dp++) { if (0 == case_ignore_strcmp(dp->name, n)) { - return dp - GPS_Datum; + return dp - GPS_Datums; } } @@ -2575,7 +2586,7 @@ int32_t GPS_Lookup_Datum_Index(const QString& n) const char* GPS_Math_Get_Datum_Name(const int datum_index) { - return GPS_Datum[datum_index].name; + return GPS_Datums[datum_index].name; } diff --git a/jeeps/gpsmath.h b/jeeps/gpsmath.h index 39dd394b1..19451987d 100644 --- a/jeeps/gpsmath.h +++ b/jeeps/gpsmath.h @@ -1,94 +1,96 @@ #ifndef JEEPS_GPSMATH_H_INCLUDED_ #define JEEPS_GPSMATH_H_INCLUDED_ -#include "jeeps/gpsport.h" +#include // for int32_t +#include // for time_t -#define GPS_PI 3.141592653589 -#define GPS_FLTMIN 1.75494351E-38 -#define GPS_FLTMAX 3.402823466E+38 +#include // for QString - double GPS_Math_Deg_To_Rad(double v); - double GPS_Math_Rad_To_Deg(double v); +constexpr double GPS_PI = 3.141592653589; - double GPS_Math_Metres_To_Feet(double v); - double GPS_Math_Feet_To_Metres(double v); + +double GPS_Math_Deg_To_Rad(double v); +double GPS_Math_Rad_To_Deg(double v); + +double GPS_Math_Metres_To_Feet(double v); +double GPS_Math_Feet_To_Metres(double v); int32_t GPS_Math_Deg_To_Semi(double v); - double GPS_Math_Semi_To_Deg(int32_t v); +double GPS_Math_Semi_To_Deg(int32_t v); - time_t GPS_Math_Utime_To_Gtime(time_t v); - time_t GPS_Math_Gtime_To_Utime(time_t v); +time_t GPS_Math_Utime_To_Gtime(time_t v); +time_t GPS_Math_Gtime_To_Utime(time_t v); - void GPS_Math_Deg_To_DegMin(double v, int32_t* d, double* m); - void GPS_Math_DegMin_To_Deg(int32_t d, double m, double* deg); - void GPS_Math_Deg_To_DegMinSec(double v, int32_t* d, int32_t* m, double* s); - void GPS_Math_DegMinSec_To_Deg(int32_t d, int32_t m, double s, double* deg); +void GPS_Math_Deg_To_DegMin(double v, int32_t* d, double* m); +void GPS_Math_DegMin_To_Deg(int32_t d, double m, double* deg); +void GPS_Math_Deg_To_DegMinSec(double v, int32_t* d, int32_t* m, double* s); +void GPS_Math_DegMinSec_To_Deg(int32_t d, int32_t m, double s, double* deg); - void GPS_Math_Airy1830LatLonToNGEN(double phi, double lambda, double* E, - double* N); - void GPS_Math_Airy1830M_LatLonToINGEN(double phi, double lambda, double* E, - double* N); +void GPS_Math_Airy1830LatLonToNGEN(double phi, double lambda, double* E, + double* N); +void GPS_Math_Airy1830M_LatLonToINGEN(double phi, double lambda, double* E, + double* N); int32_t GPS_Math_EN_To_UKOSNG_Map(double E, double N, double* mE, double* mN, char* map); int32_t GPS_Math_UKOSNG_Map_To_EN(const char* map, double mapE, double mapN, double* E, double* N); - void GPS_Math_LatLonH_To_XYZ(double phi, double lambda, double H, - double* x, double* y, double* z, - double a, double b); - void GPS_Math_XYZ_To_LatLonH(double* phi, double* lambda, double* H, - double x, double y, double z, - double a, double b); - - void GPS_Math_EN_To_LatLon(double E, double N, double* phi, - double* lambda, double N0, double E0, - double phi0, double lambda0, - double F0, double a, double b); - void GPS_Math_LatLon_To_EN(double* E, double* N, double phi, - double lambda, double N0, double E0, - double phi0, double lambda0, - double F0, double a, double b); - - void GPS_Math_NGENToAiry1830LatLon(double E, double N, double* phi, +void GPS_Math_LatLonH_To_XYZ(double phi, double lambda, double H, + double* x, double* y, double* z, + double a, double b); +void GPS_Math_XYZ_To_LatLonH(double* phi, double* lambda, double* H, + double x, double y, double z, + double a, double b); + +void GPS_Math_EN_To_LatLon(double E, double N, double* phi, + double* lambda, double N0, double E0, + double phi0, double lambda0, + double F0, double a, double b); +void GPS_Math_LatLon_To_EN(double* E, double* N, double phi, + double lambda, double N0, double E0, + double phi0, double lambda0, + double F0, double a, double b); + +void GPS_Math_NGENToAiry1830LatLon(double E, double N, double* phi, + double* lambda); +void GPS_Math_INGENToAiry1830MLatLon(double E, double N, double* phi, double* lambda); - void GPS_Math_INGENToAiry1830MLatLon(double E, double N, double* phi, - double* lambda); - - - void GPS_Math_Airy1830LatLonH_To_XYZ(double phi, double lambda, double H, - double* x, double* y, double* z); - void GPS_Math_WGS84LatLonH_To_XYZ(double phi, double lambda, double H, - double* x, double* y, double* z); - void GPS_Math_XYZ_To_Airy1830LatLonH(double* phi, double* lambda, double* H, - double x, double y, double z); - void GPS_Math_XYZ_To_WGS84LatLonH(double* phi, double* lambda, double* H, - double x, double y, double z); - - void GPS_Math_Molodensky(double Sphi, double Slam, double SH, double Sa, - double Sif, double* Dphi, double* Dlam, - double* DH, double Da, double Dif, double dx, - double dy, double dz); - void GPS_Math_Known_Datum_To_WGS84_M(double Sphi, double Slam, double SH, - double* Dphi, double* Dlam, double* DH, - int32_t n); - void GPS_Math_WGS84_To_Known_Datum_M(double Sphi, double Slam, double SH, - double* Dphi, double* Dlam, double* DH, - int32_t n); - void GPS_Math_Known_Datum_To_WGS84_C(double Sphi, double Slam, double SH, - double* Dphi, double* Dlam, double* DH, - int32_t n); - void GPS_Math_WGS84_To_Known_Datum_C(double Sphi, double Slam, double SH, - double* Dphi, double* Dlam, double* DH, - int32_t n); - - void GPS_Math_Known_Datum_To_Known_Datum_M(double Sphi, double Slam, double SH, - double* Dphi, double* Dlam, - double* DH, int32_t n1, int32_t n2); - void GPS_Math_Known_Datum_To_Known_Datum_C(double Sphi, double Slam, double SH, - double* Dphi, double* Dlam, - double* DH, int32_t n1, int32_t n2); + + +void GPS_Math_Airy1830LatLonH_To_XYZ(double phi, double lambda, double H, + double* x, double* y, double* z); +void GPS_Math_WGS84LatLonH_To_XYZ(double phi, double lambda, double H, + double* x, double* y, double* z); +void GPS_Math_XYZ_To_Airy1830LatLonH(double* phi, double* lambda, double* H, + double x, double y, double z); +void GPS_Math_XYZ_To_WGS84LatLonH(double* phi, double* lambda, double* H, + double x, double y, double z); + +void GPS_Math_Molodensky(double Sphi, double Slam, double SH, double Sa, + double Sif, double* Dphi, double* Dlam, + double* DH, double Da, double Dif, double dx, + double dy, double dz); +void GPS_Math_Known_Datum_To_WGS84_M(double Sphi, double Slam, double SH, + double* Dphi, double* Dlam, double* DH, + int32_t n); +void GPS_Math_WGS84_To_Known_Datum_M(double Sphi, double Slam, double SH, + double* Dphi, double* Dlam, double* DH, + int32_t n); +void GPS_Math_Known_Datum_To_WGS84_C(double Sphi, double Slam, double SH, + double* Dphi, double* Dlam, double* DH, + int32_t n); +void GPS_Math_WGS84_To_Known_Datum_C(double Sphi, double Slam, double SH, + double* Dphi, double* Dlam, double* DH, + int32_t n); + +void GPS_Math_Known_Datum_To_Known_Datum_M(double Sphi, double Slam, double SH, + double* Dphi, double* Dlam, + double* DH, int32_t n1, int32_t n2); +void GPS_Math_Known_Datum_To_Known_Datum_C(double Sphi, double Slam, double SH, + double* Dphi, double* Dlam, + double* DH, int32_t n1, int32_t n2); int32_t GPS_Math_WGS84_To_UKOSMap_M(double lat, double lon, double* mE, double* mN, char* map); @@ -115,34 +117,34 @@ int32_t GPS_Math_Known_Datum_To_UTM_EN(double lat, double lon, double* E, int32_t GPS_Math_UTM_EN_To_Known_Datum(double* lat, double* lon, double E, double N, int32_t zone, char zc, int n); - void GPS_Math_Swiss_LatLon_To_EN(double phi, double lambda, double* E, - double* N,double phi0,double lambda0, +void GPS_Math_Swiss_LatLon_To_EN(double phi, double lambda, double* E, + double* N,double phi0,double lambda0, + double E0, double N0, double a, double b); +void GPS_Math_Swiss_EN_To_LatLon(double E, double N, double* phi, + double* lambda, double phi0, double lambda0, + double E0, double N0, double a, double b); + +void GPS_Math_Cassini_LatLon_To_EN(double phi, double lambda, double* E, + double* N, double phi0, double M0, double E0, double N0, double a, double b); - void GPS_Math_Swiss_EN_To_LatLon(double E, double N, double* phi, - double* lambda, double phi0, double lambda0, +void GPS_Math_Cassini_EN_To_LatLon(double E, double N, double* phi, + double* lambda, double phi0, double M0, double E0, double N0, double a, double b); - void GPS_Math_Cassini_LatLon_To_EN(double phi, double lambda, double* E, - double* N, double phi0, double M0, - double E0, double N0, double a, double b); - void GPS_Math_Cassini_EN_To_LatLon(double E, double N, double* phi, - double* lambda, double phi0, double M0, - double E0, double N0, double a, double b); - int32_t GPS_Math_WGS84_To_ICS_EN(double lat, double lon, double* E, double* N); - void GPS_Math_ICS_EN_To_WGS84(double E, double N, double* lat, double* lon); +void GPS_Math_ICS_EN_To_WGS84(double E, double N, double* lat, double* lon); int32_t GPS_Math_WGS84_To_Swiss_EN(double phi, double lambda, double* E, double* N); - void GPS_Math_Swiss_EN_To_WGS84(double E, double N, double* lat, double* lon); +void GPS_Math_Swiss_EN_To_WGS84(double E, double N, double* lat, double* lon); - void GPS_Math_UTM_EN_to_LatLon(int ReferenceEllipsoid, - double UTMNorthing, double UTMEasting, - double* Lat, double* Lon, - double lambda0, double E0, double N0); +void GPS_Math_UTM_EN_to_LatLon(int ReferenceEllipsoid, + double UTMNorthing, double UTMEasting, + double* Lat, double* Lon, + double lambda0, double E0, double N0); int32_t GPS_Lookup_Datum_Index(const char* n); int32_t GPS_Lookup_Datum_Index(const QString& n); - const char* GPS_Math_Get_Datum_Name(int datum_index); +const char* GPS_Math_Get_Datum_Name(int datum_index); #endif // JEEPS_GPSMATH_H_INCLUDED_ diff --git a/jeeps/gpsmem.h b/jeeps/gpsmem.h index 01038d9fa..2d9fe6588 100644 --- a/jeeps/gpsmem.h +++ b/jeeps/gpsmem.h @@ -1,6 +1,8 @@ #ifndef JEEPS_GPSMEM_H_INCLUDED_ #define JEEPS_GPSMEM_H_INCLUDED_ +constexpr double GPS_FLTMIN = 1.75494351E-38; +constexpr double GPS_FLTMAX = 3.402823466E+38; #include "jeeps/gps.h" GPS_PPvt_Data GPS_Pvt_New(); diff --git a/jeeps/gpsproj.cc b/jeeps/gpsproj.cc index 8f138e33b..9e6c0602e 100644 --- a/jeeps/gpsproj.cc +++ b/jeeps/gpsproj.cc @@ -21,9 +21,11 @@ ** Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ********************************************************************/ -#include "jeeps/gps.h" -#include -#include +#include "jeeps/gpsproj.h" + +#include // for sin, pow, cos, fabs, log, tan, asin, atan, atan2, sqrt, exp, acos, sinh + +#include "jeeps/gpsmath.h" // for GPS_Math_Deg_To_Rad, GPS_PI, GPS_Math_Rad_To_Deg, GPS_Math_EN_To_LatLon, GPS_Math_LatLon_To_EN, GPS_Math_Cassini_EN_To_LatLon, GPS_Math_Cassini_LatLon_To_EN, GPS_Math_Swiss_EN_To_LatLon, GPS_Math_Swiss_LatLon_To_EN /* @func GPS_Math_Albers_LatLon_To_EN ********************************** diff --git a/jeeps/gpsproj.h b/jeeps/gpsproj.h index cbdca53df..dd14711fd 100644 --- a/jeeps/gpsproj.h +++ b/jeeps/gpsproj.h @@ -2,147 +2,145 @@ #define JEEPS_GPSPROJ_H_INCLUDED_ -#include "jeeps/gps.h" +void GPS_Math_Albers_LatLon_To_EN(double phi, double lambda, double* E, + double* N, double phi1, double phi2, + double phi0, double M0, double E0, + double N0, double a, double b); +void GPS_Math_Albers_EN_To_LatLon(double E, double N, double* phi, + double* lambda, double phi1, double phi2, + double phi0, double M0, double E0, + double N0, double a, double b); + + +void GPS_Math_LambertCC_LatLon_To_EN(double phi, double lambda, double* E, + double* N, double phi1, double phi2, + double phi0, double M0, double E0, + double N0, double a, double b); +void GPS_Math_LambertCC_EN_To_LatLon(double E, double N, double* phi, + double* lambda, double phi1, double phi2, + double phi0, double M0, double E0, + double N0, double a, double b); + +void GPS_Math_Miller_LatLon_To_EN(double phi, double lambda, double* E, + double* N, double M0, double E0, + double N0, double a, double b); +void GPS_Math_Miller_EN_To_LatLon(double E, double N, double* phi, + double* lambda, double M0, double E0, + double N0, double a, double b); + +void GPS_Math_Bonne_LatLon_To_EN(double phi, double lambda, double* E, + double* N, double phi0, double M0, double E0, + double N0, double a, double b); +void GPS_Math_Bonne_EN_To_LatLon(double E, double N, double* phi, + double* lambda, double phi0, double M0, + double E0, double N0, double a, double b); + +void GPS_Math_Cassini_LatLon_To_EN(double phi, double lambda, double* E, + double* N, double phi0, double M0, + double E0, double N0, double a, double b); +void GPS_Math_Cassini_EN_To_LatLon(double E, double N, double* phi, + double* lambda, double phi0, double M0, + double E0, double N0, double a, double b); - void GPS_Math_Albers_LatLon_To_EN(double phi, double lambda, double* E, - double* N, double phi1, double phi2, - double phi0, double M0, double E0, +void GPS_Math_Cylea_LatLon_To_EN(double phi, double lambda, double* E, + double* N, double phi0, double M0, + double E0, double N0, double a, double b); +void GPS_Math_Cylea_EN_To_LatLon(double E, double N, double* phi, + double* lambda, double phi0, double M0, + double E0, double N0, double a, double b); + +void GPS_Math_EckertIV_LatLon_To_EN(double phi, double lambda, double* E, + double* N, double M0, double E0, double N0, + double a, double b); +void GPS_Math_EckertIV_EN_To_LatLon(double E, double N, double* phi, + double* lambda, double M0, double E0, double N0, double a, double b); - void GPS_Math_Albers_EN_To_LatLon(double E, double N, double* phi, - double* lambda, double phi1, double phi2, - double phi0, double M0, double E0, + +void GPS_Math_EckertVI_LatLon_To_EN(double phi, double lambda, double* E, + double* N, double M0, double E0, double N0, + double a, double b); +void GPS_Math_EckertVI_EN_To_LatLon(double E, double N, double* phi, + double* lambda, double M0, double E0, double N0, double a, double b); +void GPS_Math_Cyled_LatLon_To_EN(double phi, double lambda, double* E, + double* N, double phi0, double M0, double E0, + double N0, double a, double b); +void GPS_Math_Cyled_EN_To_LatLon(double E, double N, double* phi, + double* lambda, double phi0, double M0, + double E0, double N0, double a, double b); - void GPS_Math_LambertCC_LatLon_To_EN(double phi, double lambda, double* E, - double* N, double phi1, double phi2, - double phi0, double M0, double E0, +void GPS_Math_VderGrinten_LatLon_To_EN(double phi, double lambda, double* E, + double* N, double M0, double E0, double N0, double a, double b); - void GPS_Math_LambertCC_EN_To_LatLon(double E, double N, double* phi, - double* lambda, double phi1, double phi2, - double phi0, double M0, double E0, +void GPS_Math_VderGrinten_EN_To_LatLon(double E, double N, double* phi, + double* lambda, double M0, double E0, double N0, double a, double b); - void GPS_Math_Miller_LatLon_To_EN(double phi, double lambda, double* E, - double* N, double M0, double E0, - double N0, double a, double b); - void GPS_Math_Miller_EN_To_LatLon(double E, double N, double* phi, - double* lambda, double M0, double E0, - double N0, double a, double b); - - void GPS_Math_Bonne_LatLon_To_EN(double phi, double lambda, double* E, - double* N, double phi0, double M0, double E0, - double N0, double a, double b); - void GPS_Math_Bonne_EN_To_LatLon(double E, double N, double* phi, - double* lambda, double phi0, double M0, +void GPS_Math_PolarSt_LatLon_To_EN(double phi, double lambda, double* E, + double* N, double phi1, double lambda1, + double E0, double N0, double a, double b); +void GPS_Math_PolarSt_EN_To_LatLon(double E, double N, double* phi, + double* lambda, double phi1, double lambda1, double E0, double N0, double a, double b); - void GPS_Math_Cassini_LatLon_To_EN(double phi, double lambda, double* E, - double* N, double phi0, double M0, - double E0, double N0, double a, double b); - void GPS_Math_Cassini_EN_To_LatLon(double E, double N, double* phi, - double* lambda, double phi0, double M0, - double E0, double N0, double a, double b); - - void GPS_Math_Cylea_LatLon_To_EN(double phi, double lambda, double* E, +void GPS_Math_Mollweide_LatLon_To_EN(double phi, double lambda, double* E, + double* N, double M0, double E0, + double N0, double a, double b); +void GPS_Math_Mollweide_EN_To_LatLon(double E, double N, double* phi, + double* lambda, double M0, double E0, + double N0, double a, double b); + +void GPS_Math_Orthog_LatLon_To_EN(double phi, double lambda, double* E, + double* N, double phi0, double lambda0, + double E0, double N0, double a, double b); +void GPS_Math_Orthog_EN_To_LatLon(double E, double N, double* phi, + double* lambda, double phi0, double lambda0, + double E0, double N0, double a, double b); + +void GPS_Math_Polycon_LatLon_To_EN(double phi, double lambda, double* E, double* N, double phi0, double M0, double E0, double N0, double a, double b); - void GPS_Math_Cylea_EN_To_LatLon(double E, double N, double* phi, +void GPS_Math_Polycon_EN_To_LatLon(double E, double N, double* phi, double* lambda, double phi0, double M0, double E0, double N0, double a, double b); - void GPS_Math_EckertIV_LatLon_To_EN(double phi, double lambda, double* E, - double* N, double M0, double E0, double N0, - double a, double b); - void GPS_Math_EckertIV_EN_To_LatLon(double E, double N, double* phi, - double* lambda, double M0, double E0, - double N0, double a, double b); - - void GPS_Math_EckertVI_LatLon_To_EN(double phi, double lambda, double* E, - double* N, double M0, double E0, double N0, - double a, double b); - void GPS_Math_EckertVI_EN_To_LatLon(double E, double N, double* phi, - double* lambda, double M0, double E0, - double N0, double a, double b); - - void GPS_Math_Cyled_LatLon_To_EN(double phi, double lambda, double* E, - double* N, double phi0, double M0, double E0, - double N0, double a, double b); - void GPS_Math_Cyled_EN_To_LatLon(double E, double N, double* phi, - double* lambda, double phi0, double M0, - double E0, double N0, double a, double b); +void GPS_Math_Sinusoid_LatLon_To_EN(double phi, double lambda, double* E, + double* N, double M0, double E0, + double N0, double a, double b); +void GPS_Math_Sinusoid_EN_To_LatLon(double E, double N, double* phi, + double* lambda, double M0, double E0, + double N0, double a, double b); - void GPS_Math_VderGrinten_LatLon_To_EN(double phi, double lambda, double* E, - double* N, double M0, double E0, - double N0, double a, double b); - void GPS_Math_VderGrinten_EN_To_LatLon(double E, double N, double* phi, - double* lambda, double M0, double E0, - double N0, double a, double b); - - void GPS_Math_PolarSt_LatLon_To_EN(double phi, double lambda, double* E, - double* N, double phi1, double lambda1, - double E0, double N0, double a, double b); - void GPS_Math_PolarSt_EN_To_LatLon(double E, double N, double* phi, - double* lambda, double phi1, double lambda1, - double E0, double N0, double a, double b); - - void GPS_Math_Mollweide_LatLon_To_EN(double phi, double lambda, double* E, - double* N, double M0, double E0, - double N0, double a, double b); - void GPS_Math_Mollweide_EN_To_LatLon(double E, double N, double* phi, - double* lambda, double M0, double E0, - double N0, double a, double b); +void GPS_Math_TCylEA_LatLon_To_EN(double phi, double lambda, double* E, + double* N, double phi0, double M0, double E0, + double N0, double a, double b); +void GPS_Math_TCylEA_EN_To_LatLon(double E, double N, double* phi, + double* lambda, double phi0, double M0, + double E0, double N0, double a, double b); - void GPS_Math_Orthog_LatLon_To_EN(double phi, double lambda, double* E, +void GPS_Math_Mercator_LatLon_To_EN(double phi, double lambda, double* E, double* N, double phi0, double lambda0, double E0, double N0, double a, double b); - void GPS_Math_Orthog_EN_To_LatLon(double E, double N, double* phi, - double* lambda, double phi0, double lambda0, - double E0, double N0, double a, double b); - - void GPS_Math_Polycon_LatLon_To_EN(double phi, double lambda, double* E, - double* N, double phi0, double M0, - double E0, double N0, double a, double b); - void GPS_Math_Polycon_EN_To_LatLon(double E, double N, double* phi, - double* lambda, double phi0, double M0, - double E0, double N0, double a, double b); - - void GPS_Math_Sinusoid_LatLon_To_EN(double phi, double lambda, double* E, - double* N, double M0, double E0, - double N0, double a, double b); - void GPS_Math_Sinusoid_EN_To_LatLon(double E, double N, double* phi, - double* lambda, double M0, double E0, - double N0, double a, double b); - - void GPS_Math_TCylEA_LatLon_To_EN(double phi, double lambda, double* E, - double* N, double phi0, double M0, double E0, - double N0, double a, double b); - void GPS_Math_TCylEA_EN_To_LatLon(double E, double N, double* phi, - double* lambda, double phi0, double M0, - double E0, double N0, double a, double b); - - void GPS_Math_Mercator_LatLon_To_EN(double phi, double lambda, double* E, - double* N, double phi0, double lambda0, - double E0, double N0, double a, double b); - void GPS_Math_Mercator_EN_To_LatLon(double E, double N, double* phi, - double* lambda, double phi0, - double lambda0, double E0, double N0, - double a, double b); - - void GPS_Math_TMerc_LatLon_To_EN(double phi, double lambda, double* E, - double* N, double phi0, double lambda0, - double E0, double N0, double F0, - double a, double b); - void GPS_Math_TMerc_EN_To_LatLon(double E, double N, double* phi, - double* lambda, double phi0, double lambda0, - double E0, double N0, double F0, - double a, double b); - - void GPS_Math_Swiss_LatLon_To_EN(double phi, double lambda, double* E, - double* N,double phi0,double lambda0, - double E0, double N0, double a, double b); - void GPS_Math_Swiss_EN_To_LatLon(double E, double N, double* phi, - double* lambda, double phi0, double lambda0, - double E0, double N0, double a, double b); +void GPS_Math_Mercator_EN_To_LatLon(double E, double N, double* phi, + double* lambda, double phi0, + double lambda0, double E0, double N0, + double a, double b); + +void GPS_Math_TMerc_LatLon_To_EN(double phi, double lambda, double* E, + double* N, double phi0, double lambda0, + double E0, double N0, double F0, + double a, double b); +void GPS_Math_TMerc_EN_To_LatLon(double E, double N, double* phi, + double* lambda, double phi0, double lambda0, + double E0, double N0, double F0, + double a, double b); + +void GPS_Math_Swiss_LatLon_To_EN(double phi, double lambda, double* E, + double* N,double phi0,double lambda0, + double E0, double N0, double a, double b); +void GPS_Math_Swiss_EN_To_LatLon(double E, double N, double* phi, + double* lambda, double phi0, double lambda0, + double E0, double N0, double a, double b); #endif // JEEPS_GPSPROJ_H_INCLUDED_ -- 2.30.2